#pragma once

#include <string>
#include <vector>
#include <sstream>
#include <stdexcept>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <cstring>
#include <iostream>
#include "Message.h"
#include "ConsoleUtils.h"
#include <utfcpp/utf8.h>

using std::cout;
using std::cerr;
using std::endl;
using std::string;

// 确保发送指定长度的数据。处理部分发送和 EINTR 信号中断。
ssize_t writen(int fd, const void *buf, size_t count);

// 确保读取指定长度的数据。处理部分读取和 EINTR 信号中断。
ssize_t readn(int fd, void *buf, size_t count);

// 消息打包与发送。格式: [Tag(4B)] + [Length(4B)] + [Value(Length B)]
void sendMessage(int sockfd, int tag, const std::string& value);

// 接收并解析完整的消息。
Message receiveMessage(int sockfd);

// 解析用户输入字符串为 Tag 和 Value。
bool parseInput(const std::string& input, int& tag, std::string& value);

// 清理无效的 UTF-8 字节序列。
std::string clean_query(const std::string& input_str);